<?php
class Base
{
	// 预定义返回数据
	public array $api_res = [
		'status' => 0,
		'err_msg' => '',
		'data' => null
	];
	// 配置
	public array $config;


	/**
	 * 初始化
	 */
	public function __construct()
	{
		// 加载配置文件
		$this->config = require('config.php');
	}


	/**
	 * 处理错误响应
	 * @param String $msg 错误信息
	 * @param String $jumpUrl 跳转地址（默认为空，刷新当前页面）
	 * @param Int $waitSecond 延迟跳转秒数（默认为2）
	 */
	public function error(string $msg, string $jumpUrl='', int $waitSecond=2)
	{
		echo $msg . "<br /><br />{$waitSecond}秒后自动跳转";
		if(!$jumpUrl)
		{
			echo "<meta http-equiv='refresh' content='{$waitSecond}; url={$_SERVER['HTTP_REFERER']}' />";
		}
		else
		{
			header("Location: {$jumpUrl}");
		}
		die();
	}


	/**
	 * 连接数据库
	 * @return Resource
	 */
	public function connectDB()
	{
		// 连接数据库
		$db_host = $this->config['db']['hostname'];
		$db_port = $this->config['db']['hostport'];
		$db_name = $this->config['db']['database'];
		$db_user = $this->config['db']['username'];
		$db_pwd = $this->config['db']['password'];
		$db_charset = $this->config['db']['charset'];
		$dns = "mysql:dbname={$db_name};host={$db_host}:{$db_port}";
		$con = new PDO($dns, $db_user, $db_pwd);
		$sql = "SET NAMES '{$db_charset}'";
		$con->exec($sql);

		return $con;
	}


	/**
	 * 生成密码盐
	 * @access public
	 * @param String $password 明文密码
	 * @return String $res
	 */
	public function makeSalt(string $password)
	{
		$unique_id = uniqid('', true);
		$res = md5($password . $unique_id);
		$res = substr($res, 11, 10);

		return $res;
	}


	/**
	 * 获取密文密码
	 * @access public
	 * @param String $password 明文密码
	 * @param String $salt 盐
	 * @return String $res
	 */
	public function getCryptedPassword(string $password, string $salt)
	{
		return md5($password . $salt);
	}


	/**
	 * 发送curl请求
	 * @param String $url  要请求的URL
	 * @param String $method  请求方法[get/post]
	 * @param String/Array $post_data  请求数据，模拟表单提交时为Array，提交JSON数据时为String
	 * @param String $data_type  数据类型[form/file/json/xml]
	 */
	function curlRequest($url, $method, $post_data='', $data_type='form')
	{
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		// 为项目内调用设置专用的UA
		curl_setopt($ch, CURLOPT_USERAGENT, 'Intract cURL');
		// 设置为不自动输出
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		// 不输出头部
		curl_setopt($ch, CURLOPT_HEADER, false);
		// 跳过证书检查
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		// 不从证书中检查SSL加密算法是否存在
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

		if($method == 'post')
		{
			// 根据$data_type，选择不同的HTTP Header
			$data_type = strtolower($data_type);
			switch($data_type)
			{
				case 'form':
					$header = 'application/x-www-form-urlencoded';
					$post_data = http_build_query($post_data);
					break;
				case 'file':
					$header = 'multipart/form-data';
					break;
				case 'json':
					$header = 'application/json';
					break;
				case 'xml':
					$header = 'text/xml';
					break;
				default:
					// 默认为form
					$header = 'application/x-www-form-urlencoded';
			}
			$header = [
				'Content-type: ' . $header,
				'Content-length: ' . strlen($post_data)
			];
		}

		// 根据不同的提交方式，设置头部和数据
		$method = strtolower($method);
		switch($method)
		{
			case 'get':
				break;
			case 'post':
				// 设置头部
				curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
				// 设置POST提交
				curl_setopt($ch, CURLOPT_POST, true);
				// 设置POST数据
				curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
				break;
			default:
				;
		}
		// 执行请求
		$response = curl_exec($ch);

		// 返回数据
		$res = [
			'status' => 0,
			'err_msg' => '',
			'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
			'data' => null
		];
		if($response === false)
		{
			$res['err_msg'] = curl_error($ch);
		}
		else
		{
			$res['status'] = 1;
			$res['data'] = $response;
		}
		// 关闭连接
		curl_close($ch);

		return $res;
	}


}
?>
